# 1*1的数量->6*6的数量, 为了对齐，弃用第0位
packet1 = [0, 0, 0, 4, 0, 0, 1]
packet2 = [0, 7, 5, 1, 0, 0, 0]

# 放置3*3的包裹后剩余空间可以放多少个2*2
# 顺序：0:4的倍数, 1:4的倍数+1, 2:4的倍数+2, 3:4的倍数+3
u = [0, 5, 3, 1]

def isFinished(packet):
    flag = True
    for item in packet:
        if item != 0:
            flag = False
            break

    return flag

def Packing(packet):
    N = 0   # 箱子的数量
    if isFinished(packet):
        return 0

    # 6*6, 5*5, 4*4, 3*3所需的箱子数
    # 向上取整: x + (x - 1) / y
    N = packet[6] + packet[5] + packet[4] + (packet[3] + 3) // 4
    # 放完4*4和3*3之后的空隙里还可以放几个2*2
    # 放完6*6, 5*5之后剩下的空隙不能再放2*2
    y = 5 * packet[4] + u[packet[3] % 4]
    if packet[2] >= y:
        # 从剩余的2*2中减掉可以塞进4*4和3*3的缝隙里的
        N += (packet[2] - y + 8) // 9
    # 统计已经用掉的箱子里1*1的空间剩下多少
    x = N * 36 - packet[6] * 36 - packet[5] * 25 - packet[4] * 16 - packet[3] * 9 - packet[2] * 4
    if packet[1] >= x:
        # 无法塞进前面箱子的1*1只能另开箱子来装了
        N += (packet[1] - x + 35) // 36

    return N

print(Packing(packet1))
print(Packing(packet2))
